package java20190326;

public class TestDriver {

	public static void main(String[] args) {
		test02();
	}

	private static void test02() {
		// 声明一个旧的数组
		int[] arr0 = new int[] { 1, 2, 3, 4, 5 };
		System.out.println("打印旧数组：");
		// 打印旧数组
		// 增强型的for循环
		for (int iVal : arr0) {
			System.out.print("   " + iVal);
		}

		// 换行
		System.out.println();

		// 对数组进行扩容处理
		resizeArr2(arr0, 10); // 按引用传参
		
		System.out.println("打印新数组：");
		// 增强型的for循环
		for (int iVal : arr0) {
			System.out.print("   " + iVal);
		}
		// 换行
		System.out.println();
	}

	/**
	 * 一维数组扩容
	 * 改变形参的地址，对实参没有影响
	 * 扩展作业：修改该函数使其满足要求
	 * 
	 * @param arrOld 旧数组
	 * @param newLen 新数组
	 * @return 新数组
	 */
	public static void resizeArr2(int[] arrOld, int newLen) {
		// 检测扩容的长度和原数组的长度大小关系
		if (arrOld != null) {
			// 获取旧的数组长度
			int oldLen = arrOld.length;
			// 扩容的数组的长度比旧数组的长度还小，则修改扩容长度为旧数组的2倍
			if (newLen <= oldLen) {
				newLen = oldLen * 2;
			}
		}

		// 根据长度创建一个新数组
		int[] arrNew = new int[newLen];

		// 将旧数组的内容复制到新数组的对应位置
		if (arrOld != null) {
			// 使用for循环
			for (int i = 0; i < arrOld.length; i++) {
				arrNew[i] = arrOld[i];
			}
		}
		// 把新的数组的地址入口赋值给原数组的变量名
		arrOld = arrNew; // 改变形参的地址，对实参没有影响
	}
	
	/////////////////////////////////////////////////////////////////////////////////
	private static void test01() {
		// 声明一个旧的数组
		int[] arr0 = new int[] { 1, 2, 3, 4, 5 };
		System.out.println("打印旧数组：");
		// 打印旧数组
		// 增强型的for循环
		for (int iVal : arr0) {
			System.out.print("   " + iVal);
		}

		// 换行
		System.out.println();

		// 对数组进行扩容处理
		int[] arrNew = resizeArr(arr0, 10);
		// 将数组名更为指向新数组即可
		arr0 = arrNew;
		System.out.println("打印新数组：");
		// 增强型的for循环
		for (int iVal : arr0) {
			System.out.print("   " + iVal);
		}
		// 换行
		System.out.println();
	}

	/**
	 * 一维数组扩容
	 * 
	 * @param arrOld 旧数组
	 * @param newLen 新数组
	 * @return 新数组
	 */
	public static int[] resizeArr(int[] arrOld, int newLen) {

		// 检测扩容的长度和原数组的长度大小关系
		if (arrOld != null) {
			// 获取旧的数组长度
			int oldLen = arrOld.length;
			// 扩容的数组的长度比旧数组的长度还小，则修改扩容长度为旧数组的2倍
			if (newLen <= oldLen) {
				newLen = oldLen * 2;
			}
		}

		// 根据长度创建一个新数组
		int[] arrNew = new int[newLen];

		// 将旧数组的内容复制到新数组的对应位置
		if (arrOld != null) {
			// 使用for循环
			for (int i = 0; i < arrOld.length; i++) {
				arrNew[i] = arrOld[i];
			}
		}
		// 返回新数组
		return arrNew;
	}

}
